package com.example.common;

/**
 * 统一API返回结果类
 * 格式：{"code": 200, "message": "success", "data": {...}}
 */
public class ApiResult<T> {
    
    /**
     * 状态码
     */
    private Integer code;
    
    /**
     * 消息
     */
    private String message;
    
    /**
     * 数据
     */
    private T data;
    
    // 构造函数
    public ApiResult() {}
    
    public ApiResult(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }
    
    // 成功返回 - 有数据
    public static <T> ApiResult<T> success(T data) {
        return new ApiResult<>(0, "success", data);
    }
    
    // 成功返回 - 无数据
    public static <T> ApiResult<T> success() {
        return new ApiResult<>(0, "success", null);
    }
    
    // 成功返回 - 自定义消息
    public static <T> ApiResult<T> success(String message, T data) {
        return new ApiResult<>(0, message, data);
    }
    
    // 失败返回
    public static <T> ApiResult<T> error(Integer code, String message) {
        return new ApiResult<>(code, message, null);
    }
    
    // 常见错误返回
    public static <T> ApiResult<T> error(String message) {
        return new ApiResult<>(500, message, null);
    }
    
    // 404 未找到
    public static <T> ApiResult<T> notFound() {
        return new ApiResult<>(0, "资源未找到", null);
    }
    
    // 404 未找到 - 自定义消息
    public static <T> ApiResult<T> notFound(String message) {
        return new ApiResult<>(0, message, null);
    }
    
    // 400 参数错误
    public static <T> ApiResult<T> badRequest(String message) {
        return new ApiResult<>(400, message, null);
    }
    
    // 401 未授权
    public static <T> ApiResult<T> unauthorized(String message) {
        return new ApiResult<>(401, message, null);
    }
    
    // Getter 和 Setter
    public Integer getCode() {
        return code;
    }
    
    public void setCode(Integer code) {
        this.code = code;
    }
    
    public String getMessage() {
        return message;
    }
    
    public void setMessage(String message) {
        this.message = message;
    }
    
    public T getData() {
        return data;
    }
    
    public void setData(T data) {
        this.data = data;
    }
}
